package com.shh.aiojbackendserver.app;


import com.shh.aiojbackendserver.model.dto.QuestionAi.QuestionAiAddRequest;
import com.shh.aiojbackendserver.model.entity.Question;
import com.shh.aiojbackendserver.model.entity.QuestionAi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.stereotype.Component;

import java.util.Map;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@Slf4j
@Component
public class StudyAssistApp {
    private final ChatClient chatClient;

    private static final String SYSTEM_PROMPT_STRUCTER=
                    """
                            你是一个算法领域的专家。
                            用户可以向你提问算法的问题，你需要帮用户解决心中的困惑
                            用户也可以告诉你他想做的题目类型，你负责给用户出题尽量满足用户需求
                            但是请不要自动生成创建时间和修改时间
                            不用生成id
                            submitNum和acceptedNum请默认为0
                            judgeConfig请使用json数组类型生成 例如{"timeLimit":123,"memoryLimit":"123","stackLimit":"123"}
                            生成的答案请使用java，用public class Main { public static void main(String[] args) { 答案 } }这种结构 
                            并且答案参数是从args中取
                            对于judgeCase的输出用例 你需要自己推理一下输入用例输入后所得到的输出用例是什么 而不是随意的生成
                            judgeCase判题用例格式要求：
                            - 必须使用严格的JSON数组格式
                            - 每个用例必须是{"input":"...","output":"..."}形式
                            - input部分只能包含数字和空格
                            - output部分只能是预期输出结果
                            judgeCase判题用例示例（请严格按照这种格式生成）：
                              [{
                                "input":"2 100 50 1 2",
                                "output":"150"
                              }]
                            judgeConfig的示例是这样的 {"timeLimit":2000,"memoryLimit":"256MB","stackLimit":"128MB"} 请按照这样的格式生成judgeConfig
                            要注意生成的tags 用 ["tags","tags"]这样的结构
                            生成的题目内容请使用markdown语法尽可能的详细,包括内容，示例输入，示例输出，提示
                            如果引入了外部包请在答案中也引入,很重要
                            """;

    public StudyAssistApp (ChatModel dashscopeChatModel){
        //初始化基于内存的对话记忆
        ChatMemory chatMemory = new InMemoryChatMemory();
        chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultSystem(SYSTEM_PROMPT_STRUCTER)
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory)
                )
                .build();

    }


    public QuestionAi doChat(QuestionAiAddRequest questionAiAddRequest){
        String userPrompt = "需要生成的题目为" + questionAiAddRequest.getTitle()
                + "，需要生成的难度为" + questionAiAddRequest.getDifficulty()
                + "要求的编程语言为" + questionAiAddRequest.getLanguage()
                + "。" + questionAiAddRequest.getMessage();
        QuestionAi questionAi = chatClient.prompt()
                .user(userPrompt)
//                .advisors(advisor -> advisor.param(CHAT_MEMORY_CONVERSATION_ID_KEY, questionAiAddRequest.getChatId())
//                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .call()
                .entity(QuestionAi.class);
        log.info("Content {}",questionAi);
        return questionAi;
    }
}
